{
 "cells": [
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "Predicting Food Delivery Time - Hackathon by IMS Proschool\n",
    "\n",
    "\n",
    "Size of training set: 11,094 records\n",
    "\n",
    "Size of test set: 2,774 records\n",
    "\n",
    "Hackathon closes on December 10, 2019\n",
    "\n",
    "Evaluation Metric:\n",
    "\n",
    "The final score will be calculated based on accuracy or the number of true predictions using the confusion matrix.\n",
    "\n",
    "FEATURES:\n",
    "\n",
    "Restaurant: A unique ID that represents a restaurant.\n",
    "Location: The location of the restaurant.\n",
    "Cuisines: The cuisines offered by the restaurant.\n",
    "Average_Cost: The average cost for one person/order.\n",
    "Minimum_Order: The minimum order amount.\n",
    "Rating: Customer rating for the restaurant.\n",
    "Votes: The total number of customer votes for the restaurant.\n",
    "Reviews: The number of customer reviews for the restaurant.\n",
    "Delivery_Time: The order delivery time of the restaurant. (Target Classes) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(11094, 9) (2774, 8) (13868, 9)\n"
     ]
    }
   ],
   "source": [
    "train = pd.read_excel('Data_Train.xlsx')\n",
    "test = pd.read_excel('Data_Test.xlsx')\n",
    "data = train.append(test, ignore_index=True,sort=False)\n",
    "print(train.shape,test.shape,data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Restaurant</th>\n",
       "      <th>Location</th>\n",
       "      <th>Cuisines</th>\n",
       "      <th>Average_Cost</th>\n",
       "      <th>Minimum_Order</th>\n",
       "      <th>Rating</th>\n",
       "      <th>Votes</th>\n",
       "      <th>Reviews</th>\n",
       "      <th>Delivery_Time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ID_6321</td>\n",
       "      <td>FTI College, Law College Road, Pune</td>\n",
       "      <td>Fast Food, Rolls, Burger, Salad, Wraps</td>\n",
       "      <td>₹200</td>\n",
       "      <td>₹50</td>\n",
       "      <td>3.5</td>\n",
       "      <td>12</td>\n",
       "      <td>4</td>\n",
       "      <td>30 minutes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ID_2882</td>\n",
       "      <td>Sector 3, Marathalli</td>\n",
       "      <td>Ice Cream, Desserts</td>\n",
       "      <td>₹100</td>\n",
       "      <td>₹50</td>\n",
       "      <td>3.5</td>\n",
       "      <td>11</td>\n",
       "      <td>4</td>\n",
       "      <td>30 minutes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>ID_1595</td>\n",
       "      <td>Mumbai Central</td>\n",
       "      <td>Italian, Street Food, Fast Food</td>\n",
       "      <td>₹150</td>\n",
       "      <td>₹50</td>\n",
       "      <td>3.6</td>\n",
       "      <td>99</td>\n",
       "      <td>30</td>\n",
       "      <td>65 minutes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>ID_5929</td>\n",
       "      <td>Sector 1, Noida</td>\n",
       "      <td>Mughlai, North Indian, Chinese</td>\n",
       "      <td>₹250</td>\n",
       "      <td>₹99</td>\n",
       "      <td>3.7</td>\n",
       "      <td>176</td>\n",
       "      <td>95</td>\n",
       "      <td>30 minutes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>ID_6123</td>\n",
       "      <td>Rmz Centennial, I Gate, Whitefield</td>\n",
       "      <td>Cafe, Beverages</td>\n",
       "      <td>₹200</td>\n",
       "      <td>₹99</td>\n",
       "      <td>3.2</td>\n",
       "      <td>521</td>\n",
       "      <td>235</td>\n",
       "      <td>65 minutes</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  Restaurant                             Location  \\\n",
       "0    ID_6321  FTI College, Law College Road, Pune   \n",
       "1    ID_2882                 Sector 3, Marathalli   \n",
       "2    ID_1595                       Mumbai Central   \n",
       "3    ID_5929                      Sector 1, Noida   \n",
       "4    ID_6123   Rmz Centennial, I Gate, Whitefield   \n",
       "\n",
       "                                 Cuisines Average_Cost Minimum_Order Rating  \\\n",
       "0  Fast Food, Rolls, Burger, Salad, Wraps         ₹200           ₹50    3.5   \n",
       "1                     Ice Cream, Desserts         ₹100           ₹50    3.5   \n",
       "2         Italian, Street Food, Fast Food         ₹150           ₹50    3.6   \n",
       "3          Mughlai, North Indian, Chinese         ₹250           ₹99    3.7   \n",
       "4                         Cafe, Beverages         ₹200           ₹99    3.2   \n",
       "\n",
       "  Votes Reviews Delivery_Time  \n",
       "0    12       4    30 minutes  \n",
       "1    11       4    30 minutes  \n",
       "2    99      30    65 minutes  \n",
       "3   176      95    30 minutes  \n",
       "4   521     235    65 minutes  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Restaurant          0\n",
       "Location            0\n",
       "Cuisines            0\n",
       "Average_Cost        0\n",
       "Minimum_Order       0\n",
       "Rating              0\n",
       "Votes               0\n",
       "Reviews             0\n",
       "Delivery_Time    2774\n",
       "dtype: int64"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Restaurant       8661\n",
       "Location           35\n",
       "Cuisines         2392\n",
       "Average_Cost       26\n",
       "Minimum_Order      20\n",
       "Rating             33\n",
       "Votes            1181\n",
       "Reviews           811\n",
       "Delivery_Time       7\n",
       "dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 13868 entries, 0 to 13867\n",
      "Data columns (total 9 columns):\n",
      "Restaurant       13868 non-null object\n",
      "Location         13868 non-null object\n",
      "Cuisines         13868 non-null object\n",
      "Average_Cost     13868 non-null object\n",
      "Minimum_Order    13868 non-null object\n",
      "Rating           13868 non-null object\n",
      "Votes            13868 non-null object\n",
      "Reviews          13868 non-null object\n",
      "Delivery_Time    11094 non-null object\n",
      "dtypes: object(9)\n",
      "memory usage: 975.2+ KB\n"
     ]
    }
   ],
   "source": [
    "data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "30 minutes     7406\n",
       "45 minutes     2665\n",
       "65 minutes      923\n",
       "120 minutes      62\n",
       "20 minutes       20\n",
       "80 minutes       14\n",
       "10 minutes        4\n",
       "Name: Delivery_Time, dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['Delivery_Time'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Counter({'fastfood': 3862,\n",
       "         'rolls': 620,\n",
       "         'burger': 414,\n",
       "         'salad': 284,\n",
       "         'wraps': 97,\n",
       "         'icecream': 480,\n",
       "         'desserts': 1548,\n",
       "         'italian': 751,\n",
       "         'streetfood': 935,\n",
       "         'mughlai': 1098,\n",
       "         'northindian': 5999,\n",
       "         'chinese': 4339,\n",
       "         'cafe': 592,\n",
       "         'beverages': 1789,\n",
       "         'southindian': 1507,\n",
       "         'thai': 205,\n",
       "         'asian': 259,\n",
       "         'mithai': 386,\n",
       "         'momos': 397,\n",
       "         'indonesian': 3,\n",
       "         'biryani': 1161,\n",
       "         'kerala': 73,\n",
       "         'bihari': 14,\n",
       "         'mexican': 143,\n",
       "         'japanese': 72,\n",
       "         'bakery': 864,\n",
       "         'burmese': 13,\n",
       "         'bubbletea': 6,\n",
       "         'tea': 87,\n",
       "         'pizza': 611,\n",
       "         'lucknowi': 15,\n",
       "         'mangalorean': 27,\n",
       "         'european': 89,\n",
       "         'continental': 694,\n",
       "         'sandwich': 339,\n",
       "         'healthyfood': 352,\n",
       "         'bengali': 132,\n",
       "         'american': 163,\n",
       "         'mishti': 82,\n",
       "         'hyderabadi': 85,\n",
       "         'andhra': 111,\n",
       "         'assamese': 4,\n",
       "         'maharashtrian': 135,\n",
       "         'german': 9,\n",
       "         'arabian': 82,\n",
       "         'fingerfood': 67,\n",
       "         'kebab': 214,\n",
       "         'chettinad': 14,\n",
       "         'seafood': 246,\n",
       "         'juices': 198,\n",
       "         'parsi': 15,\n",
       "         'sushi': 50,\n",
       "         'odia': 21,\n",
       "         'tamil': 3,\n",
       "         'cantonese': 2,\n",
       "         'northeastern': 29,\n",
       "         'tibetan': 47,\n",
       "         'lebanese': 120,\n",
       "         'spanish': 4,\n",
       "         'barfood': 25,\n",
       "         'konkan': 6,\n",
       "         'paan': 34,\n",
       "         'steak': 22,\n",
       "         'mediterranean': 32,\n",
       "         'bohri': 1,\n",
       "         'afghan': 24,\n",
       "         'goan': 11,\n",
       "         'gujarati': 12,\n",
       "         'bbq': 61,\n",
       "         'rawmeats': 16,\n",
       "         'malaysian': 16,\n",
       "         'vietnamese': 18,\n",
       "         'srilankan': 1,\n",
       "         'rajasthani': 35,\n",
       "         'poké': 10,\n",
       "         'roastchicken': 5,\n",
       "         'coffee': 53,\n",
       "         'brazilian': 6,\n",
       "         'belgian': 5,\n",
       "         'naga': 8,\n",
       "         'korean': 20,\n",
       "         'modernindian': 25,\n",
       "         'awadhi': 15,\n",
       "         'kashmiri': 11,\n",
       "         'french': 8,\n",
       "         'portuguese': 3,\n",
       "         'charcoalchicken': 3,\n",
       "         'frozenyogurt': 5,\n",
       "         'bangladeshi': 5,\n",
       "         'malwani': 20,\n",
       "         'iranian': 10,\n",
       "         'nepalese': 3,\n",
       "         'indian': 4,\n",
       "         'tex-mex': 4,\n",
       "         'hotdogs': 4,\n",
       "         'southamerican': 3,\n",
       "         'middleeastern': 6,\n",
       "         'african': 2,\n",
       "         'turkish': 9,\n",
       "         'israeli': 2,\n",
       "         'greek': 1})"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['Cuisines'] = data['Cuisines'].str.lower()\n",
    "data['Cuisines'] = data['Cuisines'].str.replace(' ','')\n",
    "Cuisines_list = data['Cuisines'].str.split(',')\n",
    "from collections import Counter\n",
    "Cuisines_counter = Counter(([a for b in Cuisines_list.tolist() for a in b]))\n",
    "Cuisines_counter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# Cuisines_list_set = set([a for b in Cuisines_list.tolist() for a in b])\n",
    "# for Cuisines in Cuisines_list_set:\n",
    "#     print(Cuisines, \": \", train[train['Cuisines'].str.contains(Cuisines)]['Delivery_Time'].median())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "data['Cuisines'] = data['Cuisines'].str.replace('rolls','fastfood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('burger','fastfood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('wraps','fastfood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('streetfood','fastfood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('momos','fastfood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('sandwich','fastfood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('fingerfood','fastfood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('barfood','fastfood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('rawmeats','fastfood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('hotdogs','fastfood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('cafe','fastfood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('pizza','fastfood')\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('icecream','desserts')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('mithai','desserts')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('bakery','desserts')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('bubbletea','desserts')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('mishti','desserts')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('paan','desserts')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('frozenyogurt','desserts')\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('italian','european')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('german','european')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('spanish','european')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('steak','european')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('mediterranean','european')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('brazilian','european')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('belgian','european')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('french','european')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('portuguese','european')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('african','european')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('greek','european')\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('mexican','american')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('bbq','american')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('roastchicken','american')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('charcoalchicken','american')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('tex-mex','american')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('southamerican','american')\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('arabian','middleeast')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('kebab','middleeast')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('lebanese','middleeast')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('afghan','middleeast')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('iranian','middleeast')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('middleeastern','middleeast')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('turkish','middleeast')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('israeli','middleeast')\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('chinese','chinese')\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('kerala','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('bihari','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('Lucknowi','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('mangalorean','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('bengali','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('andhra','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('assamese','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('maharashtrian','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('chettinad','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('parsi','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('odia','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('tamil','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('northeastern','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('bohri','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('goan','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('gujarati','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('rajasthani','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('naga','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('awadhi','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('kashmiri','regional')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('malwani','regional')\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('thai','seafood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('konkan','seafood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('srilankan','seafood')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('poké','seafood')\n",
    "\n",
    "#data['Cuisines'] = data['Cuisines'].str.replace('thai','asian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('indonesian','asian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('japanese','asian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('burmese','asian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('sushi','asian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('cantonese','asian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('tibetan','asian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('malaysian','asian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('vietnamese','asian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('korean','asian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('bangladeshi','asian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('nepalese','asian')\n",
    "\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('tea','beverages')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('juices','beverages')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('coffee','beverages')\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('hyderabadi','biryani')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('lucknowi','biryani')\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('indian','northindian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('modernindian','northindian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('modernnorthindian','northindian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('northindian','northindian')\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('northnorthindian','northindian')\n",
    "\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('southnorthindian','southindian')\n",
    "\n",
    "data['Cuisines'] = data['Cuisines'].str.replace('salad','healthyfood')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Counter({'fastfood': 7979,\n",
       "         'healthyfood': 636,\n",
       "         'desserts': 3405,\n",
       "         'european': 932,\n",
       "         'mughlai': 1098,\n",
       "         'northindian': 6028,\n",
       "         'chinese': 4339,\n",
       "         'beverages': 2127,\n",
       "         'southindian': 1507,\n",
       "         'seafood': 468,\n",
       "         'asian': 508,\n",
       "         'biryani': 1261,\n",
       "         'regional': 691,\n",
       "         'american': 382,\n",
       "         'continental': 694,\n",
       "         'middleeast': 467})"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['Cuisines'] = data['Cuisines'].str.lower()\n",
    "data['Cuisines'] = data['Cuisines'].str.replace(' ','')\n",
    "Cuisines_list = data['Cuisines'].str.split(',')\n",
    "from collections import Counter\n",
    "Cuisines_counter = Counter(([a for b in Cuisines_list.tolist() for a in b]))\n",
    "Cuisines_counter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# for Cuisines in Cuisines_counter.keys():\n",
    "#     data[Cuisines] = 0\n",
    "#     data.loc[data['Cuisines'].str.contains(Cuisines), Cuisines] = 1\n",
    "# del data['Cuisines']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "data['Delivery_Time'] = data['Delivery_Time'].str.replace(' minutes','')\n",
    "data['Delivery_Time']=pd.to_numeric(data['Delivery_Time'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "data['City']=data.Location.str.rpartition(',')[2]\n",
    "data['Locality']=data.Location.str.rpartition(',')[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:1: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \"\"\"Entry point for launching an IPython kernel.\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:3: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  This is separate from the ipykernel package so we can avoid doing imports until\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:4: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  after removing the cwd from sys.path.\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:5: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \"\"\"\n"
     ]
    }
   ],
   "source": [
    "data.Locality[data.City.str.contains('Delhi University-GTB Nagar')]='Delhi University-GTB Nagar'\n",
    "data.Locality[data.City.str.contains('Mumbai Central')]='Mumbai Central'\n",
    "data.Locality[data.City.str.contains('Majestic')]='Majestic'\n",
    "data.Locality[data.City.str.contains('Delhi Cantt.')]='Delhi Cantt'\n",
    "data.Locality[data.City.str.contains('Pune University')]='Pune University'\n",
    "data['Locality'] = data['Locality'].str.strip()\n",
    "data['Locality'] = data['Locality'].str.lower()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:1: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \"\"\"Entry point for launching an IPython kernel.\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:3: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  This is separate from the ipykernel package so we can avoid doing imports until\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:4: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  after removing the cwd from sys.path.\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:5: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \"\"\"\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:6: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:7: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  import sys\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:8: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  \n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:9: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  if __name__ == '__main__':\n"
     ]
    }
   ],
   "source": [
    "data.City[data.City.str.contains('Delhi University-GTB Nagar')]='Delhi'\n",
    "data.City[data.City.str.contains('Mumbai CST Area')]='Mumbai'\n",
    "data.City[data.City.str.contains('Mumbai Central')]='Mumbai'\n",
    "data.City[data.City.str.contains('India Gate')]='Delhi'\n",
    "data.City[data.City.str.contains('Delhi Cantt.')]='Delhi'\n",
    "data.City[data.City.str.contains('Maharashtra')]='Pune'\n",
    "data.City[data.City.str.contains('Pune University')]='Pune'\n",
    "data.City[data.City.str.contains('Gurgoan')]='Gurgaon'\n",
    "data.City[data.City.str.contains('Electronic City')]='Bangalore'\n",
    "\n",
    "# data.City[data.City.str.contains('Whitefield')]='Bangalore'\n",
    "# data.City[data.City.str.contains('Marathalli')]='Bangalore'\n",
    "\n",
    "data['City'] = data['City'].str.strip()\n",
    "data['City'] = data['City'].str.lower()\n",
    "del data['Location']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "data1=data.copy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "data['Average_Cost'] = data['Average_Cost'].str.replace(\"[^0-9]\",\"\")\n",
    "data['Average_Cost'] = data['Average_Cost'].str.strip()\n",
    "data['Average_Cost']=pd.to_numeric(data['Average_Cost'])\n",
    "\n",
    "# data.Average_Cost.fillna(data.groupby(['City','Locality'])['Average_Cost'].transform('mean'), inplace=True)\n",
    "\n",
    "data['Minimum_Order'] = data['Minimum_Order'].str.replace(\"[^0-9]\",\"\")\n",
    "data['Minimum_Order'] = data['Minimum_Order'].str.strip()\n",
    "data['Minimum_Order']=pd.to_numeric(data['Minimum_Order'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "data.Rating = data.Rating.replace(\"NEW\",np.nan)\n",
    "data.Rating = data.Rating.replace(\"-\",np.nan)\n",
    "data.Rating = data.Rating.replace(\"Opening Soon\",np.nan)\n",
    "data.Rating = data.Rating.replace(\"Temporarily Closed\",np.nan)\n",
    "data.Rating = data.Rating.astype('float')\n",
    "# data.Rating.fillna(data.groupby(['City','Locality'])['Rating'].transform('mean'), inplace=True)\n",
    "#data.Rating.fillna(0, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "data.Votes = data.Votes.replace(\"-\",np.nan)\n",
    "data.Votes = data.Votes.astype('float')\n",
    "# data.Votes.fillna(data.groupby(['City','Locality'])['Votes'].transform('mean'), inplace=True)\n",
    "#data.Votes.fillna(0, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "data.Reviews = data.Reviews.replace(\"-\",np.nan)\n",
    "data.Reviews = data.Reviews.astype('float')\n",
    "# data.Reviews.fillna(data.groupby(['City','Locality'])['Reviews'].transform('mean'), inplace=True)\n",
    "#data.Reviews.fillna(0, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(13868, 10)\n"
     ]
    }
   ],
   "source": [
    "print(data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "data['total_div_of_reviews'] = data['Votes']/data['Reviews']\n",
    "data['total_sum_of_reviews'] = data['Votes']*data['Reviews']\n",
    "\n",
    "data['total_div_of_ratings'] = data['Votes']/data['Rating']\n",
    "data['total_sum_of_ratings'] = data['Votes']*data['Rating']\n",
    "\n",
    "data['total_div_of_Minimum_Order'] = data['Votes']/data['Minimum_Order']\n",
    "data['total_sum_of_Minimum_Order'] = data['Votes']*data['Minimum_Order']\n",
    "\n",
    "data['total_div_of_Average_Cost'] = data['Votes']/data['Average_Cost']\n",
    "data['total_sum_of_Average_Cost'] = data['Votes']*data['Average_Cost']\n",
    "\n",
    "data['total_div_of_ratings_Reviews'] = data['Rating']/data['Reviews']\n",
    "data['total_sum_of_ratings_1'] = data['Rating']*data['Reviews']\n",
    "\n",
    "data['total_div_of_Minimum_Order_1'] = data['Rating']/data['Minimum_Order']\n",
    "data['total_sum_of_Minimum_Order_1'] = data['Rating']*data['Minimum_Order']\n",
    "\n",
    "data['total_div_of_Average_Cost_1'] = data['Rating']/data['Average_Cost']\n",
    "data['total_sum_of_Average_Cost_1'] = data['Rating']*data['Average_Cost']\n",
    "\n",
    "data['total_div_of_reviews_Minimum_Order_1'] = data['Reviews']/data['Minimum_Order']\n",
    "data['total_sum_of_reviews_Minimum_Order_1'] = data['Reviews']*data['Minimum_Order']\n",
    "\n",
    "data['total_div_of_reviews_Average_Cost_1'] = data['Reviews']/data['Average_Cost']\n",
    "data['total_sum_of_reviews_Average_Cost_1'] = data['Reviews']*data['Average_Cost']\n",
    "\n",
    "data['total_div_of_Minimum_Order_Average_Cost_1'] = data['Average_Cost']/data['Minimum_Order']\n",
    "data['total_sum_of_Minimum_Order_Average_Cost_1'] = data['Average_Cost']*data['Minimum_Order']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "data1['total_div_of_reviews']  = data['total_div_of_reviews']\n",
    "data1['total_div_of_ratings']  = data['total_div_of_ratings']\n",
    "data1['total_sum_of_Average_Cost']  = data['total_sum_of_Average_Cost']\n",
    "data1['total_div_of_Average_Cost_1']  = data['total_div_of_Average_Cost_1']\n",
    "data1['total_div_of_Minimum_Order_1']  = data['total_div_of_Minimum_Order_1']\n",
    "data1['total_sum_of_Minimum_Order']  = data['total_sum_of_Minimum_Order']\n",
    "data1['total_div_of_Average_Cost']  = data['total_div_of_Average_Cost']\n",
    "data1['total_div_of_ratings_Reviews']  = data['total_div_of_ratings_Reviews']\n",
    "data1['total_div_of_reviews_Average_Cost_1']  = data['total_div_of_reviews_Average_Cost_1']\n",
    "data1['total_sum_of_Average_Cost_1']  = data['total_sum_of_Average_Cost_1']\n",
    "data1['total_sum_of_reviews_Minimum_Order_1']  = data['total_sum_of_reviews_Minimum_Order_1']\n",
    "data1['total_div_of_Minimum_Order']  = data['total_div_of_Minimum_Order']\n",
    "data1['total_sum_of_ratings_1']  = data['total_sum_of_ratings_1']\n",
    "data1['total_sum_of_reviews']  = data['total_sum_of_reviews']\n",
    "data1['total_sum_of_ratings']  = data['total_sum_of_ratings']\n",
    "data1['total_sum_of_reviews_Average_Cost_1']  = data['total_sum_of_reviews_Average_Cost_1']\n",
    "data1['total_sum_of_Minimum_Order_1']  = data['total_sum_of_Minimum_Order_1']\n",
    "data1['total_div_of_reviews_Minimum_Order_1']  = data['total_div_of_reviews_Minimum_Order_1']\n",
    "data1['total_div_of_Minimum_Order_Average_Cost_1']  = data['total_div_of_Minimum_Order_Average_Cost_1']\n",
    "data1['total_sum_of_Minimum_Order_Average_Cost_1']  = data['total_sum_of_Minimum_Order_Average_Cost_1']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(13868, 30)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data1.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x2462a5f08d0>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "colormap = plt.cm.RdBu\n",
    "plt.figure(figsize=(13,13))\n",
    "sns.heatmap(data1.corr(),linewidths=0.1,square=True, cmap=colormap, linecolor='white', annot=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_x=data1[~data1['Delivery_Time'].isnull()]\n",
    "train_y=train_x['Delivery_Time']\n",
    "test_x=data1[data1['Delivery_Time'].isnull()]\n",
    "\n",
    "del train_x['Delivery_Time']\n",
    "del test_x['Delivery_Time']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_valid, y_train, y_valid = train_test_split(train_x, train_y, test_size = 0.2, random_state = 18121995, stratify=train_y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# CATBOOST"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8], dtype=int64)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "categorical_features_indices = np.where(X_train.dtypes =='object')[0]\n",
    "categorical_features_indices"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Stratified 5-Fold"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "import catboost\n",
    "def make_classifier():\n",
    "    model = catboost.CatBoostClassifier(\n",
    "        iterations=30000,\n",
    "        random_state=18121995,\n",
    "        learning_rate=0.01,\n",
    "        loss_function='MultiClass',\n",
    "        early_stopping_rounds=200,\n",
    "    )\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "● Fold : 1\n",
      "0:\tlearn: 1.9152420\ttest: 1.9154858\tbest: 1.9154858 (0)\ttotal: 210ms\tremaining: 1h 44m 45s\n",
      "500:\tlearn: 0.5892425\ttest: 0.5085193\tbest: 0.5085193 (500)\ttotal: 7m 54s\tremaining: 7h 45m 44s\n",
      "1000:\tlearn: 0.5614690\ttest: 0.4855592\tbest: 0.4855592 (1000)\ttotal: 14m 16s\tremaining: 6h 53m 29s\n",
      "1500:\tlearn: 0.5356555\ttest: 0.4747040\tbest: 0.4747040 (1500)\ttotal: 24m 12s\tremaining: 7h 39m 46s\n",
      "2000:\tlearn: 0.5179895\ttest: 0.4702693\tbest: 0.4702693 (2000)\ttotal: 33m 23s\tremaining: 7h 47m 12s\n",
      "2500:\tlearn: 0.5027555\ttest: 0.4675298\tbest: 0.4674977 (2495)\ttotal: 42m 13s\tremaining: 7h 44m 16s\n",
      "3000:\tlearn: 0.4889398\ttest: 0.4659033\tbest: 0.4658852 (2998)\ttotal: 50m 50s\tremaining: 7h 37m 22s\n",
      "3500:\tlearn: 0.4763554\ttest: 0.4648889\tbest: 0.4648803 (3497)\ttotal: 59m 33s\tremaining: 7h 30m 44s\n",
      "4000:\tlearn: 0.4645750\ttest: 0.4642382\tbest: 0.4642215 (3972)\ttotal: 1h 7m 57s\tremaining: 7h 21m 34s\n",
      "Stopped by overfitting detector  (200 iterations wait)\n",
      "\n",
      "bestTest = 0.4639574697\n",
      "bestIteration = 4143\n",
      "\n",
      "\n",
      "\n",
      "● Fold : 2\n",
      "0:\tlearn: 1.9162250\ttest: 1.9164263\tbest: 1.9164263 (0)\ttotal: 151ms\tremaining: 1h 15m 33s\n",
      "500:\tlearn: 0.5902053\ttest: 0.5094744\tbest: 0.5094744 (500)\ttotal: 5m 50s\tremaining: 5h 43m 34s\n",
      "1000:\tlearn: 0.5612285\ttest: 0.4847123\tbest: 0.4847123 (1000)\ttotal: 11m 58s\tremaining: 5h 47m 2s\n",
      "1500:\tlearn: 0.5345448\ttest: 0.4744468\tbest: 0.4744468 (1500)\ttotal: 21m 18s\tremaining: 6h 44m 31s\n",
      "2000:\tlearn: 0.5156803\ttest: 0.4701310\tbest: 0.4701310 (2000)\ttotal: 30m 50s\tremaining: 7h 11m 37s\n",
      "2500:\tlearn: 0.5004707\ttest: 0.4678451\tbest: 0.4678451 (2500)\ttotal: 40m 37s\tremaining: 7h 26m 37s\n",
      "3000:\tlearn: 0.4868464\ttest: 0.4661248\tbest: 0.4661248 (3000)\ttotal: 50m 11s\tremaining: 7h 31m 33s\n",
      "3500:\tlearn: 0.4744669\ttest: 0.4650245\tbest: 0.4650086 (3495)\ttotal: 59m 50s\tremaining: 7h 32m 53s\n",
      "4000:\tlearn: 0.4628104\ttest: 0.4644750\tbest: 0.4644618 (3992)\ttotal: 1h 9m 23s\tremaining: 7h 30m 53s\n",
      "4500:\tlearn: 0.4517543\ttest: 0.4639937\tbest: 0.4638893 (4366)\ttotal: 1h 19m 2s\tremaining: 7h 27m 46s\n",
      "5000:\tlearn: 0.4415625\ttest: 0.4636423\tbest: 0.4635315 (4836)\ttotal: 1h 28m 46s\tremaining: 7h 23m 44s\n",
      "Stopped by overfitting detector  (200 iterations wait)\n",
      "\n",
      "bestTest = 0.4635315442\n",
      "bestIteration = 4836\n",
      "\n",
      "\n",
      "\n",
      "● Fold : 3\n",
      "0:\tlearn: 1.9144798\ttest: 1.9144753\tbest: 1.9144753 (0)\ttotal: 1.11s\tremaining: 9h 13m\n",
      "500:\tlearn: 0.5907768\ttest: 0.5084471\tbest: 0.5084471 (500)\ttotal: 5m 36s\tremaining: 5h 30m 41s\n",
      "1000:\tlearn: 0.5629620\ttest: 0.4865932\tbest: 0.4865932 (1000)\ttotal: 11m 50s\tremaining: 5h 43m 8s\n",
      "1500:\tlearn: 0.5385776\ttest: 0.4773956\tbest: 0.4773956 (1500)\ttotal: 20m 14s\tremaining: 6h 24m 17s\n",
      "2000:\tlearn: 0.5209735\ttest: 0.4734961\tbest: 0.4734961 (2000)\ttotal: 28m 50s\tremaining: 6h 43m 34s\n",
      "2500:\tlearn: 0.5074535\ttest: 0.4709841\tbest: 0.4709815 (2496)\ttotal: 37m 31s\tremaining: 6h 52m 31s\n",
      "3000:\tlearn: 0.4939681\ttest: 0.4691449\tbest: 0.4691449 (3000)\ttotal: 45m 59s\tremaining: 6h 53m 50s\n",
      "3500:\tlearn: 0.4816955\ttest: 0.4678298\tbest: 0.4678235 (3499)\ttotal: 54m 41s\tremaining: 6h 53m 54s\n",
      "4000:\tlearn: 0.4702644\ttest: 0.4664263\tbest: 0.4664178 (3998)\ttotal: 1h 3m 12s\tremaining: 6h 50m 43s\n",
      "4500:\tlearn: 0.4592669\ttest: 0.4656793\tbest: 0.4656195 (4488)\ttotal: 1h 11m 53s\tremaining: 6h 47m 14s\n",
      "5000:\tlearn: 0.4488323\ttest: 0.4652398\tbest: 0.4651847 (4983)\ttotal: 1h 20m 22s\tremaining: 6h 41m 44s\n",
      "Stopped by overfitting detector  (200 iterations wait)\n",
      "\n",
      "bestTest = 0.4651397107\n",
      "bestIteration = 5197\n",
      "\n",
      "\n",
      "\n",
      "● Fold : 4\n",
      "0:\tlearn: 1.9156477\ttest: 1.9158113\tbest: 1.9158113 (0)\ttotal: 158ms\tremaining: 1h 19m 10s\n",
      "500:\tlearn: 0.5874252\ttest: 0.5194699\tbest: 0.5194699 (500)\ttotal: 5m 27s\tremaining: 5h 21m 49s\n",
      "1000:\tlearn: 0.5559504\ttest: 0.4981993\tbest: 0.4981993 (1000)\ttotal: 11m 31s\tremaining: 5h 33m 52s\n",
      "1500:\tlearn: 0.5297436\ttest: 0.4912941\tbest: 0.4912941 (1500)\ttotal: 19m 51s\tremaining: 6h 16m 58s\n",
      "2000:\tlearn: 0.5118975\ttest: 0.4881403\tbest: 0.4881356 (1989)\ttotal: 28m 22s\tremaining: 6h 37m\n",
      "2500:\tlearn: 0.4969031\ttest: 0.4862136\tbest: 0.4862136 (2500)\ttotal: 36m 59s\tremaining: 6h 46m 42s\n",
      "3000:\tlearn: 0.4834653\ttest: 0.4853857\tbest: 0.4853595 (2980)\ttotal: 45m 48s\tremaining: 6h 52m 3s\n",
      "3500:\tlearn: 0.4715606\ttest: 0.4847061\tbest: 0.4846075 (3456)\ttotal: 54m 55s\tremaining: 6h 55m 45s\n",
      "4000:\tlearn: 0.4599895\ttest: 0.4842335\tbest: 0.4842142 (3975)\ttotal: 1h 3m 23s\tremaining: 6h 51m 53s\n",
      "4500:\tlearn: 0.4492771\ttest: 0.4838858\tbest: 0.4838764 (4326)\ttotal: 1h 11m 57s\tremaining: 6h 47m 38s\n",
      "5000:\tlearn: 0.4390480\ttest: 0.4835928\tbest: 0.4834108 (4895)\ttotal: 1h 20m 20s\tremaining: 6h 41m 35s\n",
      "Stopped by overfitting detector  (200 iterations wait)\n",
      "\n",
      "bestTest = 0.4834108169\n",
      "bestIteration = 4895\n",
      "\n",
      "\n",
      "\n",
      "finished in 5:32:57.350323\n"
     ]
    }
   ],
   "source": [
    "import os, sys, datetime\n",
    "from time import time\n",
    "import catboost\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "start_time = time()\n",
    "\n",
    "NFOLDS = 5\n",
    "folds = StratifiedKFold(n_splits=NFOLDS, shuffle=False, random_state=18121995)\n",
    "models = []\n",
    "scores = []\n",
    "for fold, (train_ids, test_ids) in enumerate(folds.split(train_x, train_y)):\n",
    "    print('● Fold :', fold+1)\n",
    "    model = make_classifier()\n",
    "    model.fit(train_x.loc[train_ids], train_y.loc[train_ids], \n",
    "              eval_set=(train_x.loc[test_ids], train_y.loc[test_ids]),\n",
    "              use_best_model=False,\n",
    "              verbose=500,\n",
    "              cat_features=categorical_features_indices)    \n",
    "    models.append(model)\n",
    "    print('\\n')\n",
    "\n",
    "print('finished in {}'.format( \n",
    "    str(datetime.timedelta(seconds=time() - start_time))))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max Voting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>vote</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>45</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>45</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>45</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>30</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>65</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>45</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>30</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>65</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11064</th>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>65</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11065</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11066</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11067</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11068</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11069</th>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11070</th>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11071</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11072</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11073</th>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11074</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11075</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11076</th>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45</td>\n",
       "      <td>45.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11077</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11078</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11079</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11080</th>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>65</td>\n",
       "      <td>45</td>\n",
       "      <td>65</td>\n",
       "      <td>65.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11081</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11082</th>\n",
       "      <td>120</td>\n",
       "      <td>120</td>\n",
       "      <td>120</td>\n",
       "      <td>30</td>\n",
       "      <td>120</td>\n",
       "      <td>120.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11083</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11084</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11085</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11086</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11087</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11088</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11089</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11090</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11091</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11092</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11093</th>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30</td>\n",
       "      <td>30.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>11094 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         0    1    2   3  vote      y\n",
       "0       30   30   30  30    30   30.0\n",
       "1       30   30   30  30    30   30.0\n",
       "2       65   65   65  65    65   65.0\n",
       "3       30   30   30  30    30   30.0\n",
       "4       45   65   65  65    65   65.0\n",
       "5       30   30   30  30    30   30.0\n",
       "6       30   30   30  30    30   30.0\n",
       "7       45   45   45  45    45   45.0\n",
       "8       30   30   30  30    30   30.0\n",
       "9       45   65   65  65    65   65.0\n",
       "10      45   30   30  30    30   30.0\n",
       "11      45   45   45  45    45   45.0\n",
       "12      30   30   30  30    30   30.0\n",
       "13      30   45   45  45    45   45.0\n",
       "14      30   30   30  30    30   30.0\n",
       "15      30   30   30  30    30   30.0\n",
       "16      30   30   30  30    30   30.0\n",
       "17      30   30   30  30    30   30.0\n",
       "18      30   30   30  30    30   30.0\n",
       "19      30   30   30  30    30   30.0\n",
       "20      65   45   45  45    45   45.0\n",
       "21      45   45   45  45    45   45.0\n",
       "22      30   30   30  30    30   30.0\n",
       "23      45   65   65  65    65   65.0\n",
       "24      30   30   30  30    30   30.0\n",
       "25      30   45   45  45    45   45.0\n",
       "26      65   45   45  45    45   45.0\n",
       "27      45   45   45  45    45   45.0\n",
       "28      45   45   45  45    45   45.0\n",
       "29      30   30   30  30    30   30.0\n",
       "...    ...  ...  ...  ..   ...    ...\n",
       "11064   45   45   45  65    45   45.0\n",
       "11065   30   30   30  30    30   30.0\n",
       "11066   30   30   30  30    30   30.0\n",
       "11067   30   30   30  30    30   30.0\n",
       "11068   30   30   30  30    30   30.0\n",
       "11069   65   65   65  65    65   65.0\n",
       "11070   65   65   65  65    65   65.0\n",
       "11071   30   30   30  30    30   30.0\n",
       "11072   30   30   30  30    30   30.0\n",
       "11073   45   45   45  45    45   45.0\n",
       "11074   30   30   30  30    30   30.0\n",
       "11075   30   30   30  30    30   30.0\n",
       "11076   45   45   45  45    45   45.0\n",
       "11077   30   30   30  30    30   30.0\n",
       "11078   30   30   30  30    30   30.0\n",
       "11079   30   30   30  30    30   30.0\n",
       "11080   65   65   65  45    65   65.0\n",
       "11081   30   30   30  30    30   30.0\n",
       "11082  120  120  120  30   120  120.0\n",
       "11083   30   30   30  30    30   30.0\n",
       "11084   30   30   30  30    30   30.0\n",
       "11085   30   30   30  30    30   30.0\n",
       "11086   30   30   30  30    30   30.0\n",
       "11087   30   30   30  30    30   30.0\n",
       "11088   30   30   30  30    30   30.0\n",
       "11089   30   30   30  30    30   30.0\n",
       "11090   30   30   30  30    30   30.0\n",
       "11091   30   30   30  30    30   30.0\n",
       "11092   30   30   30  30    30   30.0\n",
       "11093   30   30   30  30    30   30.0\n",
       "\n",
       "[11094 rows x 6 columns]"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy import stats\n",
    "\n",
    "predictions = []\n",
    "for model in models:\n",
    "    predictions.append(model.predict(train_x).astype(int))\n",
    "predictions = np.concatenate(predictions, axis=1)\n",
    "df = pd.DataFrame(predictions)\n",
    "\n",
    "vote = stats.mode(predictions, axis=1)[0].reshape(-1)\n",
    "df['vote'] = vote\n",
    "df['y'] = train_y\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2774,)\n"
     ]
    }
   ],
   "source": [
    "predictions = []\n",
    "for model in models:\n",
    "    predictions.append(model.predict(test_x))\n",
    "predictions = np.concatenate(predictions, axis=1)\n",
    "# Voting\n",
    "predictions = stats.mode(predictions, axis=1)[0].reshape(-1)\n",
    "print(predictions.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "a=pd.DataFrame()\n",
    "# predcb=predcb.astype(int)\n",
    "# predcb=predcb.flatten()\n",
    "a['Delivery_Time']=np.round(predictions).astype('int')\n",
    "a['Delivery_Time'] = a['Delivery_Time'].replace({30:'30 minutes', 45:'45 minutes', 65:'65 minutes', 120:'120 minutes', 20:'20 minutes', 80:'80 minutes', 10:'10 minutes'})\n",
    "a.to_excel('cb_all_cat_1.0.xlsx', index=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Feature Importance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(10.377356183231015, 'Restaurant'),\n",
       " (7.930605897929039, 'Reviews'),\n",
       " (7.749546794567969, 'City'),\n",
       " (6.588395525325439, 'total_div_of_reviews'),\n",
       " (6.411406811556494, 'Locality'),\n",
       " (5.935268823425313, 'Rating'),\n",
       " (5.428381087287029, 'Votes'),\n",
       " (5.387031557527161, 'Cuisines'),\n",
       " (4.3792849275016, 'Average_Cost'),\n",
       " (4.180058416281173, 'Minimum_Order'),\n",
       " (3.751974106226216, 'total_div_of_Minimum_Order_1'),\n",
       " (3.0631764497723717, 'total_div_of_ratings'),\n",
       " (3.0558233082290807, 'total_sum_of_Average_Cost'),\n",
       " (2.4972015949934048, 'total_div_of_Average_Cost_1'),\n",
       " (2.4123341645863556, 'total_div_of_Average_Cost'),\n",
       " (2.3560221426473746, 'total_sum_of_Minimum_Order'),\n",
       " (2.297927972337105, 'total_sum_of_ratings'),\n",
       " (1.9966706060061465, 'total_sum_of_reviews'),\n",
       " (1.8849892206462362, 'total_sum_of_Average_Cost_1'),\n",
       " (1.7350044194533418, 'total_div_of_reviews_Average_Cost_1'),\n",
       " (1.7284593167392528, 'total_div_of_ratings_Reviews'),\n",
       " (1.689383109834103, 'total_div_of_Minimum_Order'),\n",
       " (1.6064829946444403, 'total_sum_of_reviews_Average_Cost_1'),\n",
       " (1.4594990440614037, 'total_sum_of_Minimum_Order_1'),\n",
       " (1.208503417580261, 'total_sum_of_ratings_1'),\n",
       " (1.0235326290396756, 'total_div_of_reviews_Minimum_Order_1'),\n",
       " (0.9577464164508255, 'total_sum_of_reviews_Minimum_Order_1'),\n",
       " (0.6192498190080895, 'total_sum_of_Minimum_Order_Average_Cost_1'),\n",
       " (0.288683243111763, 'total_div_of_Minimum_Order_Average_Cost_1')]"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sorted(zip(model.feature_importances_,train_x),reverse=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "feat_importances=pd.Series(model.feature_importances_,index=train_x.columns)\n",
    "feat_importances.nsmallest(1000).plot(kind='barh')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
